﻿#!usr/bin/env python3
# -*- conding: utf-8 -*-
#时间日期学习笔记
#http://www.2cto.com/kf/201401/276088.html 
#https://docs.python.org/3/#

import sys,io

sys.path.append("..")  #把上层目录加入环境变量
sys.path.append(".")  #把当前cd进的目录加入环境变量


#需要cd到该文件的目录才能正常导入
from utils.dtUtils import getStpFromDate,getLocalTZ,utcToLocal
import time,math

#又是一个介绍解决 UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 问题的地址
#http://www.cnblogs.com/feng18/p/5646925.html 
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') #改变标准输出的默认编码

def splitFunc(moName):
    print("\n---------------- 学习[%s]模块开始 --------------"%moName)

#1.time模块-----------------------------
splitFunc('time')
print(time)

timestamp = time.time() #获取当前时间戳
print("time.time()获取当前时间戳",timestamp)
#time.struct_time
structTime = time.localtime(timestamp) #把时间戳转换成本地时间信息

print('type(structTime)=',type(structTime)) 
print(" time.localtime(timestamp)把时间戳转换成本地时间信息",structTime,structTime.tm_year) #
print('time.ctime 把timestamp转换成字符串 ',time.ctime(timestamp)) #把timestamp转换成字符串 类似 ：Sun Jun 20 23:21:05 1993
ts1 = time.asctime(structTime) #把time.struct_time转换成字符串 类似 ：Sun Jun 20 23:21:05 1993
print("time.asctime 把time.struct_time转换成字符串",ts1)
tstp = time.mktime(structTime) #time.mktime(t) 把时间元组转换成时间戳
print("time.mktime(t) 把时间元组转换成时间戳",tstp)
#time.strftime和time.strptime
fmt = "%Y-%m-%d %H:%M:%S" #格式化字符串参见:timeFmt.txt
fmTimeStr=time.strftime(fmt,structTime) # %H 24小时制的格式化,%I 12小时制的格式化
print("time.strftime() 把时间元组格式化",fmTimeStr)
ts = time.strptime(fmTimeStr,fmt) #把给定的时间字符串和格式返回struct_time
print("time.strptime(fmTimeStr,fmt)",ts)
print("time.timezone",time.timezone,abs(time.timezone)) #返回和标准时区的差,东半球是负数,西半球是正数

# time clock()

'''
time clock() 函数以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时，比time.time()更有用。
这个需要注意，在不同的系统上含义不同。在UNIX系统上，它返回的是"进程时间"，它是用秒表示的浮点数（时间戳）。
而在WINDOWS中，第一次调用，返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。
（实际上是以WIN32上QueryPerformanceCounter()为基础，它比毫秒表示更为精确）
'''

clk = time.clock()
print("time.clock() 1",clk) #第一次调用

count=0
while(count<5000):
    count+=1    
#time.sleep(1) #程序挂起1秒    
clk = time.clock() #第二次调用;返回从第一次到现在运行多长时间(返回的是以秒为单位的浮点数) 用了计算程序运行的时间非常准确
print("time.clock() 2 间隔了",clk,'秒')

# 2.datetime -----------------------------------------------
from datetime import datetime,timedelta,timezone,date,time as DTime
splitFunc("datetime")

# timedelta对象 可以表示两个日期或者时间之间的差
print(DTime)
#total_seconds方法可以获取到秒数
print("timedelta可以表示两个日期或者时间之间的差",timedelta(days=1).total_seconds())

# date对象
td1 = date(2016,12,7) #date对象 必须参数:year, month, day ; 年、月、日
td2 = date(2016,12,8)
dif = td2-td1 #日期差 返回的就是timedelta对象

today=td1.today() #date.today方法返回的是年月日的日期同样是一个date对象:2016-12-7
td1.ctime()  #同样有ctime方法 
print(type(dif),dif,td1.ctime(),"date.today方法返回的是年月日的日期",today,type(today)) 
tsd = date.fromtimestamp(timestamp) #把时间戳转换成date对象
tstruct = tsd.timetuple() #把一个date对象转换成time_struct对象
ts = tsd.strftime('%Y-%m-%d %H:%M:%S') #同样可以通过strftime格式化
print(tsd,tstruct,ts)
tsp = getStpFromDate(tsd) #自定义方法;把一个date对象转换成时间戳
print(tsp)

# datetime 对象

today = datetime.today() #返回一个本地时间的datetime对象 和now()方法效果一样
print("--------XXX----",today,datetime.now(),type(today))

utcToday = datetime.utcnow() #返回格林威治标准时间的当前时间
print(utcToday)

today.timestamp() # datetime对象也有timestamp方法 也有类方法timestamp
datetime.timestamp(today) # 也有类方法timestamp

print(datetime.timestamp(today))
print(type(time.timezone),time.timezone/60/60)
hours = time.timezone/60/60
tz = timezone(timedelta(hours=hours))
tz = getLocalTZ()
print(tz.tzname(datetime.utcnow()))

print("------ utcToLocal ----------",utcToLocal(utcToday))
print(utcToday.tzinfo)

dobj = date(2016,12,8)
dtobj = datetime.now()
print('time',time.strftime,time.strptime)
print('dobj',dobj.strftime,dobj.timetuple)
print('dtobj',dtobj.strftime,dtobj.strptime,dtobj.timetuple)

fmt = "%Y-%m-%d %H:%M:%S"
tstr = "2016-12-08 11:36:00"

timeArr = time.strptime(tstr,fmt)
print(timeArr) # 得到的是time.struct_time实例

ret = dtobj.strptime(tstr,fmt) #得到的是datetime实例
print(ret,type(ret),ret.timestamp())

'''

总结:
1. time 内建类比较常用的方法有:
   time() 获取当前时间戳,
   localtime(timestamp) 把时间戳转换成 time.struct_time 实例
   mktime(time.struct_time) 把 time.struct_time 转换成时间戳
   strftime 把time.struct_time格式化为字符串
   strptime 把字符串转换成 time.struct_time  
2. time.struct_time 类是一个很有用的东西,
    可以通过date、datetime对象的timetuple方法得到该实例,
    然后通过 time.mktime(time.struct_time) 转换成时间戳
    time 对象则可以直接time.localtime(timstamp)得到time.struct_time实例
    
3. time、datetime类或者实例都有 strftime strptime 实例方法(或者类方法(time)),
    前者是把时间元组time.struct_time格式化为想要的时间字符串
    后者则是把时间字符串转换成对应的类实例(datetime)、或者时间元组(time)
    date对象只有 strftime 方法
4.  date datetime 对象都有 fromtimestamp 方法可以把一个时间戳转换成对应的实例
    另外 datetime 对象还有 fromtimestamp 的反函数 timestamp 把datetime实例转换成时间戳
    
'''

#2016年12月8日11:56:57 完成 时间日期 模块的学习 有空要多看看这个文件

